#ifndef PROPERTY_H
#define PROPERTY_H

#include "detail/property_impl.h"
namespace vpm 
{
	namespace utils
	{
		using namespace vpm::utils::detail;

		template <class KeyT = std::string > 
		class Property
		{
		public:

			Property()
			{

			}

			Property(const KeyT & n1 )
			{
				m_propertyImpl.set_mandatory_property(n1);
			}

			Property(const KeyT & n1 ,const KeyT & n2)
			{
				m_propertyImpl.set_mandatory_property(n1);
				m_propertyImpl.set_mandatory_property(n2);
			}

			Property(const KeyT & n1 ,const KeyT & n2,const KeyT & n3)
			{
				m_propertyImpl.set_mandatory_property(n1);
				m_propertyImpl.set_mandatory_property(n2);
				m_propertyImpl.set_mandatory_property(n3);
			}

			Property(const KeyT & n1 ,const KeyT & n2,const KeyT & n3,const KeyT & n4)
			{
				m_propertyImpl.set_mandatory_property(n1);
				m_propertyImpl.set_mandatory_property(n2);
				m_propertyImpl.set_mandatory_property(n3);
				m_propertyImpl.set_mandatory_property(n4);
			}

			Property(const KeyT & n1 ,const KeyT & n2,const KeyT & n3,const KeyT & n4,const KeyT & n5)
			{
				m_propertyImpl.set_mandatory_property(n1);
				m_propertyImpl.set_mandatory_property(n2);
				m_propertyImpl.set_mandatory_property(n3);
				m_propertyImpl.set_mandatory_property(n4);
				m_propertyImpl.set_mandatory_property(n5);
			}


			template <class ValueT> 
			bool set_property( const KeyT & n , ValueT  v)
			{
				return m_propertyImpl.set_property<ValueT>(n, v);
			}

			template <class ValueT> 
			ValueT get_property(const KeyT & n)
			{
				return m_propertyImpl.get_property<ValueT>(n);
			}

			void set_mandatory_property(const KeyT & n)
			{
				m_propertyImpl.set_mandatory_property(n);
			}

			bool check_mandatory_properties()
			{
				return m_propertyImpl.check_mandatory_properties();
			}

		private:
			PropertyImpl<KeyT> m_propertyImpl; 
		};

	}
}

#endif // 

